package com.zhangxin.aiInterview.manager.knoewlege_base_api;

import java.util.concurrent.*;

/**
 * 单例模型
 * 程序中所有线程共用同一个concurrentHashMap
 * 用来存储每个用户的CompletableFuture，
 * 这样每个用户都可以通过CompletableFuture.get()方法等待异步结果，
 * 或者通过CompletableFuture.complete()方法设置异步结果。
 */
public class ExamQuestionFutureManager {

    // 每个用户一个CompletableFuture（等待异步结果）
    private static final ConcurrentHashMap<Long, CompletableFuture<String>> userFutureMap = new ConcurrentHashMap<>();

    // 创建并绑定一个新的Future
    public static CompletableFuture<String> createFuture(Long userId) {
        CompletableFuture<String> future = new CompletableFuture<>();
        userFutureMap.put(userId, future);
        return future;
    }

    // 获取某个用户的Future（如果不存在返回null，需要调用前先createFuture）
    public static CompletableFuture<String> getFuture(Long userId) {
        return userFutureMap.get(userId);
    }

    // 完成Future，给用户设置异步结果
    public static void completeFuture(Long userId, String result) {
        CompletableFuture<String> future = userFutureMap.get(userId);
        if (future != null) {
            future.complete(result);
            userFutureMap.remove(userId); // 完成后移除，防止内存泄露
        }
    }

    // 超时等待异步结果
    public static String waitForResult(Long userId, long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
        CompletableFuture<String> future = userFutureMap.get(userId);
        if (future != null) {
            return future.get(timeout, timeUnit);
        }
        return null;
    }

    // 删除某个用户的future（比如超时、异常、退出等场景）
    public static void removeFuture(Long userId) {
        userFutureMap.remove(userId);
    }
}

